#include "window.h"
#include "ui_window.h"
#include "glsprites.h"
#include <QTimer>
#include <QKeyEvent>
#include <QTime>
#include <QMessageBox>

window::window(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::window)
{
    ui->setupUi(this);

    gl = new GLWidget();    // sukuriamas GLWidget objektas

    // gl patalpinimas per visą ekraną
    this->setLayout(ui->verticalLayout);
    ui->verticalLayout->addWidget(gl);

    installEventFilter( this );

    // sukuriamas laikmatis, sukonfiguruoji signalai ir slotai
    timer = new QTimer(this);
    connect( timer, SIGNAL(timeout()), this, SLOT(frame()) );
    timer->start(0);
}

window::~window()
{
    delete ui;
    delete gl;
    delete timer;
}

void window::changeEvent(QEvent *e)
{
    QDialog::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

// siunčia key eventą gl objektui
void window::keyPressEvent(QKeyEvent *e)
{
    gl->handleKeys( e, true );
}

// siunčia key eventą gl objektui
void window::keyReleaseEvent(QKeyEvent *e)
{
    gl->handleKeys( e, false );
}

// filtruoja eventus ieškodamas WindowDeactivate
bool window::eventFilter(QObject *o, QEvent *e)
{
    if ( e->type() == QEvent::WindowDeactivate ) {
        gl->lostFocus();
    }
    return QWidget::eventFilter( o, e );
}

// kadro metodas, čia kviečiami metodai kurie turi vykti kiekvieną kadrą
void window::frame()
{
    timer->stop();
    static QTime time;      // laikas naudojamas nustatyti kadro laiką
    time = QTime::currentTime();

    gl->handleControls();   // tikrinamas valdymas

    int r = gl->doLogic();  // čia vygdoma fizika

    gl->updateGL();     // renderinamas GL vaizdas

    if ( r != -1) {
        int ms = time.msecsTo( QTime::currentTime() );  // suskaičiuojama kiek laiko užtruko kadro generaviams
        timer->start((16>ms)?16-ms:0);                  // jei laiko liko, galima ir pamiegoti
    } else {
        QApplication::exit();   // nutraukiamas programos vykdymas
    }
}
